package com.zdp.leetcodeMiddle;

import java.util.ArrayList;
import java.util.List;

/*
* 题目描述：
* 给定一个包含 m x n 个元素的矩阵（m 行, n 列），请按照顺时针螺旋顺序，返回矩阵中的所有元素。
示例 1:
输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 螺旋矩阵_54 {
    public static void main(String[] args) {
        螺旋矩阵_54 demo = new 螺旋矩阵_54();
        int[][] martix = new int[][] {
                {1,2,3,4},{5,6,7,8},{9,10,11,12}
        };
        int[][] martix1 = new int[][] {
                {7},{9},{6}
        };
        List<Integer> integers = demo.spiralOrder(martix1);
        System.out.println(integers.toString());

    }

    /*
     * 就是按层模拟，一层一层来
     * ----->
     * ^    |
     * |    |
     * |    |
     * |    |
     * <----v
     * 但边界条件我扣得有点难受
     * */
    public List<Integer> spiralOrder(int[][] matrix) {
        int i = 0;
        int j = 0;
        int m = matrix.length-1;
        int n = matrix[0].length-1;
        List<Integer> result = new ArrayList<>();
        while(i<=m&&j<=n){
           for(int kj = j;kj<=n;kj++){
               result.add(matrix[i][kj]);
           }
           for(int ki = i+1;ki<= m;ki++){
               result.add(matrix[ki][n]);
           }
           /*
           * 说明 若只有一列或者一行
           * 就不需要再进行接下来的操作了
           * */
           if(i<m&&j<n){
               for(int kj = n-1;kj>j;kj--){
                   result.add(matrix[m][kj]);
               }
               for(int ki = m;ki>i;ki--){
                   result.add(matrix[ki][j]);
               }
           }
           i++;
           j++;
           m--;
           n--;
        }
        return result;
    }


}
